home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Online
/
SpeakFreely
/
src
/
lpc10
/
tbdm.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-18
|
2KB
|
105 lines
/***********************************************************************
*
* TBDM Version 49
*
**********************************************************************
*
* TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function
*
* Inputs:
* SPEECH - Low pass filtered speech
* LPITA - Length of speech buffer
* TAU - Table of lags
* LTAU - Number of lag values to compute
* Outputs:
* AMDF - Average Magnitude Difference for each lag in TAU
* MINPTR - Index of minimum AMDF value
* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min
* MINTAU - Lag corresponding to minimum AMDF value
*/
#include "lpcdefs.h"
tbdm( speech, tau, amdf, minptr, maxptr, mintau )
float speech[], amdf[];
int *minptr, *maxptr, *mintau, tau[];
{
int minamd;
int i, ptr, ltau2, minp2, maxp2;
float amdf2[6];
static int tau2[6];
static int count=0;
/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU), AMDF2(6)
/* Compute full AMDF using log spaced lags, find coarse minimum */
difmag(speech, tau, LTAU, tau[LTAU], amdf, minptr, maxptr );
*mintau = tau[*minptr];
minamd = amdf[*minptr];
/* Build table containing all lags within +/- 3 of the AMDF minimum
* excluding all that have already been computed */
ltau2 = 0;
ptr = *minptr - 2;
for(i=mmax(*mintau-3,41); i<=mmin(*mintau+3,tau[LTAU]); i++) {
while( tau[ptr] < i ) {
ptr++;
}
if( tau[ptr] !=i) {
ltau2++;
tau2[ltau2-1] = i;
}
}
/* Compute AMDF of the new lags, if there are any, and choose one
* if it is better than the coarse minimum */
if( ltau2 > 0 ) {
difmag(speech, &tau2[0]-1, ltau2, tau[LTAU], &amdf2[0]-1, &minp2, &maxp2);
if( amdf2[minp2-1] < minamd ) {
*mintau = tau2[minp2-1];
minamd = amdf2[minp2-1];
}
}
/* Check one octave up, if there are any lags not yet computed */
if( *mintau >= 80 ) {
i = *mintau*0.5;
if( (i & 1) == 0 ) {
ltau2 = 2;
tau2[0] = i-1;
tau2[1] = i+1;
}
else {
ltau2 = 1;
tau2[0] = i;
}
difmag(speech, &tau2[0]-1, ltau2, tau[LTAU], &amdf2[0]-1, &minp2, &maxp2 );
if( amdf2[minp2-1] < minamd ) {
*mintau = tau2[minp2-1];
minamd = amdf2[minp2-1];
*(minptr) -= 20;
}
}
/* Force minimum of the AMDF array to the high resolution minimum */
amdf[*minptr] = minamd;
/* Find maximum of AMDF within 1/2 octave of minimum */
*maxptr = mmax(*minptr-5,1);
for(i=*maxptr+1; i<= mmin(*minptr+5,LTAU); i++) {
if( amdf[i] > amdf[*maxptr]) *maxptr = i;
}
}